home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / oplaser / oplaser.lzh / boss01.c next >
C/C++ Source or Header  |  1998-10-25  |  5KB  |  258 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <XSP2lib.H>
  5. #include <pcm8afnc.h>
  6. #include <sys/dos.h>
  7. #include <sys/iocs.h>
  8. #include "boss01.h"
  9. #include "fxsp2lib.h"
  10.  
  11.  
  12. #define    PCG_MAX    1024        /* スプライトPCGパターン最大使用数 */
  13. #define    REF_MAX    1024        /* 複合スプライトリファレンスデータ最大使用数 */
  14. #define    FRM_MAX    1024        /* 複合スプライトフレームデータ最大使用数 */
  15. #define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
  16.  
  17. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  18. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  19. static XOBJ_FRM_DAT frm_dat[FRM_MAX];    /* フレームデータ */
  20. static XOBJ_REF_DAT ref_dat[REF_MAX];    /* リファレンスデータ */
  21. static int old_crtmod;
  22.  
  23. char f_option_flag = 0;
  24.  
  25.  
  26.  
  27. void usage (void)
  28. {
  29.     printf ("中ボステストパターン表示&作成 boss01.x ver0.01\n"
  30.         "        programmed by Mitsuky <FreeSoftware>\n"
  31. #if    0
  32.         ".PLG ファイル中のポリゴンを直接変更します\n"
  33.         "使用法 : boss01 [option] ファイル名...\n"
  34.         "[option]\n"
  35.         "    -Px,y,z : 頂点移動座標\n"
  36.         "ファイル名は複数指定できます\n"
  37. #endif
  38.     );
  39. }
  40.  
  41. /* 起動時のファイル読み込み */
  42. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  43. int load_file (char *fname, void *ptr, size_t size, size_t n)
  44. {
  45.     FILE *fp;
  46.     int i;
  47.  
  48.     if ((fp = fopen (fname, "rb")) == NULL) {
  49.         //fatal_error (ERROR_FILE, fname);
  50.         printf ("%s が読めません\n", fname);
  51.     }
  52.     i = fread (ptr, size, n, fp);
  53.     fclose (fp);
  54.  
  55.     return (i);        /* 返り値は読み込みバイト数 */
  56. }
  57.  
  58.  
  59. void wait_vdisp (void)
  60. {
  61.     int sp;
  62.     sp = _iocs_b_super (0);
  63.     while ((*(volatile unsigned char *) 0xe88001) & 0x10 == 0);
  64.     while ((*(volatile unsigned char *) 0xe88001) & 0x10);
  65.     _iocs_b_super (sp);
  66. }
  67.  
  68.  
  69.  
  70. void init (void)
  71. {
  72.     int i, sp;
  73.     unsigned short *s, *d;
  74.     unsigned short pal_dat[16 * 15];    /* パレットデータファイル読み込みバッファ */
  75.     int sizeof_ref;        /* 複合スプライトリファレンスデータ読み込み数 */
  76.     unsigned short crtcdata[9] =
  77.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 785};
  78.     unsigned short textpalet[16] =
  79.     {0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  80.  
  81.     old_crtmod = _iocs_crtmod (-1);
  82.     _iocs_b_curoff ();
  83.     wait_vdisp ();
  84.     _iocs_crtmod (14);    /* 256*256dot 31kHz 65536色 */
  85.     _iocs_g_clr_on ();
  86.     _iocs_b_curoff ();
  87.     _iocs_ms_curof ();
  88.     _iocs_skey_mod (0, 0, 0);
  89.  
  90.     //sp = _iocs_b_super (0);
  91.     //*(unsigned short *) 0xe82600 &= 0xff80;    /* 画面表示全オフ */
  92.     //_iocs_b_super (sp);
  93.  
  94.  
  95.     _iocs_sp_init ();
  96.     _iocs_sp_on ();        /* スプライト表示をON */
  97.     _iocs_bgctrlst (0, 0, 0);    /* BG0表示OFF */
  98.     _iocs_bgctrlst (1, 1, 0);    /* BG1表示OFF */
  99.  
  100.  
  101.     /* 256x256 正方形モードを作る */
  102.     sp = _iocs_b_super (0);
  103.     *(unsigned short *) 0xe80028 = crtcdata[8];
  104.     d = (unsigned short *) 0xe80002;
  105.     for (i = 1; i < 8; i++)
  106.         *d++ = crtcdata[i];
  107.     *(unsigned short *) 0xe80000 = crtcdata[0];
  108.  
  109.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  110.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  111.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  112.     *(unsigned short *) 0xeb080e = crtcdata[6];
  113.  
  114.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  115.     _iocs_b_super (sp);
  116.  
  117.     load_file ("BOSS01.SP", pcg_dat, sizeof (char), 128 * PCG_MAX);
  118.     load_file ("BOSS01.PAL", pal_dat, 2, 16 * 15);
  119.  
  120.     /* パレットに転送 */
  121.     sp = _iocs_b_super (0);
  122.     s = (unsigned short *) 0xe82200;
  123.     for (i = 0; i < 16; i++)
  124.         *s++ = textpalet[i];
  125.     d = pal_dat;
  126.     for (i = 0; i < 15 * 16; i++)
  127.         *s++ = *d++;
  128.     _iocs_b_super (sp);
  129.  
  130.     {
  131.         struct _lineptr lp;
  132.         lp.x1 = 0;
  133.         lp.y1 = 128;
  134.         lp.x2 = 255;
  135.         lp.y2 = 128;
  136.         lp.color = 0xf800;
  137.         lp.linestyle = 0xaaaa;
  138.         _iocs_line (&lp);
  139.         lp.x1 = 128;
  140.         lp.y1 = 0;
  141.         lp.x2 = 128;
  142.         lp.y2 = 255;
  143.         _iocs_line (&lp);
  144.     }
  145.     seq_init0 ();
  146.     enemy_init0 ();
  147.  
  148.     _dos_breakck (2);    /* BREAK チェックを殺す */
  149.  
  150.     if (f_option_flag)
  151.         fxsp_on ();
  152.     xsp_on ();
  153.     xsp_mode (2);
  154.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  155.     //xsp_objdat_set (ref_dat);
  156.     //pcm8a_vsyncint_on ();
  157.  
  158.     //sp = _iocs_b_super (0);
  159.     //*(unsigned short *) 0xe82600 |= 0x007f;    /* 画面表示オン */
  160.     //_iocs_b_super (sp);
  161. }
  162.  
  163.  
  164. int tini (void)
  165. {
  166.     int sp;
  167.  
  168.     //pcm8a_vsyncint_off ();
  169.     xsp_off ();
  170.     if (f_option_flag)
  171.         fxsp_off ();
  172.  
  173.     enemy_tini ();
  174.     wait_vdisp ();
  175.  
  176.     sp = _iocs_b_super (0);
  177.     *(unsigned short *) 0xe8e006 &= 0xfffd;    /* HRL ビット */
  178.     _iocs_b_super (sp);
  179.  
  180.     _iocs_skey_mod (-1, 0, 0);
  181.     _iocs_b_curon ();
  182.     _iocs_crtmod (old_crtmod);
  183.  
  184.     return (0);
  185. }
  186.  
  187.  
  188.  
  189. void game (void)
  190. {
  191.     seq_init ();
  192.  
  193.     for (;;) {
  194.         do {
  195.             seq_move ();
  196.             enemy_move ();
  197.             xsp_out ();
  198.             if (f_option_flag)
  199.                 fxsp_out ();
  200.             if (f_option_flag && (seq_counter > 35))
  201.                 break;
  202.         } while ((_iocs_ms_getdt ()& 0xffff) == 0);
  203.         if (f_option_flag || (_iocs_ms_getdt ()& 0x00ff))
  204.             break;
  205.         enemy_tini ();
  206.         seq_init ();
  207.     }
  208. }
  209.  
  210.  
  211.  
  212. int main (int argc, char *argv[])
  213. {
  214.     int i;
  215.     int slash_flag = 0;
  216.     int fname_found_flag = 0;    /* ファイル名が1つでもあったか */
  217.  
  218.     {
  219.         char *temp;
  220.  
  221.         temp = getenv ("SLASH");
  222.         if ((temp != NULL) && (*temp == '/')) {
  223.             slash_flag = 1;
  224.         }
  225.     }
  226.  
  227.     for (i = 1; i < argc; i++) {
  228.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  229.             switch (*(argv[i] + 1)) {
  230.  
  231.             case 'f':
  232.             case 'F':
  233.                 f_option_flag = !0;
  234.                 break;
  235.  
  236.             default:
  237.                 usage ();
  238.                 return (-1);
  239.             }
  240.         } else {
  241.             fname_found_flag = 1;
  242.         }
  243.     }
  244.  
  245. #if    0
  246.     if (fname_found_flag == 0) {
  247.         usage ();
  248.         return (-1);
  249.     }
  250. #endif
  251.     init ();
  252.     game ();
  253.  
  254.     tini ();
  255.  
  256.     return (0);
  257. }
  258.